package com.ruoyi.system.service;

import java.util.List;
import java.util.Map;

import com.ruoyi.system.domain.SysAlert;
import com.ruoyi.system.domain.SysHealthData;
import com.ruoyi.system.domain.qo.AlertListQo;
import com.ruoyi.system.domain.vo.IndexVo;
import com.ruoyi.system.domain.vo.AlertListVo;
import com.ruoyi.system.domain.vo.SysAlertDetailVo;

/**
 * 预警列表 服务层
 *
 * @author ruoyi
 */
public interface ISysAlertService {
    /**
     * 查询预警信息
     *
     * @param id 预警ID
     * @return 预警信息
     */
    SysAlert selectSysAlertById(Long id);

    /**
     * 查询预警信息
     *
     * @param id 预警ID
     * @return 预警信息
     */
    SysAlertDetailVo getAlertDetailById(Long id);

    /**
     * 查询预警列表
     *
     * @param sysAlert 预警信息
     * @return 预警集合
     */
    List<SysAlert> selectSysAlertList(SysAlert sysAlert);

    /**
     * 查询预警列表
     *
     * @param alertListQo 预警信息
     * @return 预警集合
     */
    List<AlertListVo> selectAlertList(AlertListQo alertListQo);

    /**
     * 查询聚合列表
     *
     * @param alertListQo 预警信息
     * @return 预警集合
     */
    List<AlertListVo> selectAggregateList(AlertListQo alertListQo);

    /**
     * 新增预警
     *
     * @param sysAlert 预警信息
     * @return 结果
     */
    int insertSysAlert(SysAlert sysAlert);

    /**
     * 修改预警
     *
     * @param sysAlert 预警信息
     * @return 结果
     */
    int updateSysAlert(SysAlert sysAlert);

    /**
     * 删除预警信息
     *
     * @param id 预警ID
     * @return 结果
     */
    int deleteSysAlertById(Long id);

    /**
     * 批量删除预警信息
     *
     * @param ids 需要删除的预警ID
     * @return 结果
     */
    int deleteSysAlertByIds(Long[] ids);

    /**
     * 定时任务：根据预警配置和健康数据生成预警
     * 以设备为维度，遍历所有设备的最新健康数据，结合预警配置生成预警
     */
    void generateAlertsFromHealthData(SysHealthData healthData);

    /**
     * 按预警等级和预警名称统计数量
     */
    List<Map<String, Object>> countAlertByLevelAndName();

    /**
     * 获取服务用户数量
     *
     * @return 服务用户数量
     */
    Map<String, Long> getTodayAlertCount();

    /**
     * 按小时统计当天的预警信息
     *
     * @return 预警统计信息
     */
    Map<String, List<IndexVo>> countAlertByMinutes(Long minutes);

    /**
     * 按小时统计当天的预警信息
     *
     * @return 预警统计信息
     */
    Map<String, List<IndexVo>> countAlertByHour();

    /**
     * 按天统计当月的预警信息
     *
     * @return 预警统计信息
     */
    Map<String, List<IndexVo>> countAlertByDay();

    /**
     * 查询用户最近一个预警信息
     * @param userId 用户ID
     * @return 预警信息
     */
    SysAlert selectLatestAlertByUserId(Long userId);
}